#递归函数 函数调用自己本身
#准则
#1 必须有明确结束条件
#2 每次递归问题逐渐减少
#3 相邻的两次递归联系紧密
#优点代码简洁 缺点耗内存,运行效率低
from pythonModuleLib import modMath
print(modMath.acc(100)) #acc() 自定义的递归函数 用于计算0-x累加的和
print(modMath.fs(20)) #求斐波那契数列 x代表第几项
#闭包
#准则
#1 函数嵌套定义时
#2 内层函数使用了外层函数局部变量
#3 外层函数的返回值是内层函数名
def outer(n) :
    def inner(m):
        return n+m
    return inner #返回的是内层函数地址 记住不加括号
print(outer(10))
print(outer(10)(5)) #执行outer返回inner函数,第二个括号执行inner函数
ir = outer(10) #或者分开调用
print(ir(5))
#每一次开始内函数,都在使用同一份闭包变量(外层传进来的值)
print(ir(10))
print(ir(15)) #用的都是同一个外层变量10 每调用一次内层函数,内层函数都会被重新创建销毁一次,但使用的外层函数值是一样的
#装饰器
#在不更改原函数的代码下,添加新的功能 要求1 不改变源程序或函数的代码 2 不改变源程序或函数的调用方法
#本质上是一个闭包函数,返回值也是一个函数
#标准装饰器
def t1():
    print("新增函数1")
def t2():
    print("新增函数2")
def outers(fun) : #标准修饰器
    def inners():
        print("基础代码")
        fun()
    return inners
irs = outers(t1)
irs2 = outers(t2)
irs()
irs2()
#标准的装饰器还是比较繁琐,python提供了语法糖更方便
#语法糖 @修饰器名称 代表下面函数被修饰器调用作为参数
@outers
def t3():
    print("新增函数3")
t3() #自己琢磨出来的优点,首先少一行 irs = outers(t1) 调用修饰器的代码,其次可以直接使用函数名调用,不用多起一个变量名接收

